<?

/**
 * Usuarios class
 *
 * Esta clase maneja los usuarios
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Usuarios
*/
class Usuarios extends Core {

	static protected $instancia;
	static protected $opciones = array();

	function __construct ($opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Seteo las opciones
		if ($opciones)
			$this->opciones($opciones);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Agrega un usuario
	 * 
	 * @param array $sso Usuario sso
	 * @return int Id del nuevo 
	 */
	public function agregar ($usuario) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si coinciden el pass1 y el pass2
		if (isset($usuario['pass2']) && ($usuario['pass'] != $usuario['pass2']))
			return ($this)? $this->fail('La clave y su repeticion no coinciden') : false;
	
		// Me fijo si ya existe el usuario
		if ($db->get_var("SELECT id_usuario FROM usuarios WHERE user = '".addslashes($usuario['user'])."'"))
			return ($this)? $this->fail('Ya existe el usuario "'.addslashes($usuario['user']).'"') : false;

		unset($usuario['id_usuario']);
		$usuario['pass'] = md5($usuario['pass']);

		// Inserto el usuario
		$id_usuario = $db->insert('usuarios', $usuario);

		return $id_usuario;
	}

	/**
	 * Lista los usuarios del sistema
	 * 
	 * @return array
	 */
	function listar ($opciones=null) {
	
		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);

		// Obtengo una conexion a la base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Armo los filtros
		$and = '';
		if ($opciones['filtros'])
			$and .= 'AND '.implode(' AND ', $opciones['filtros']);

		$usuarios = array();

		$query = "SELECT u.*, COUNT(c.id_cita) citas_pendientes
				FROM usuarios u 
				LEFT JOIN citas c ON u.id_usuario = c.id_usuario AND c.pendiente = 1
				WHERE 1=1 $and
				GROUP BY u.id_usuario
				ORDER BY u.id_usuario";

		$usuarios = array();
		if ($_usuarios = $db->get_results($query))
			foreach ($_usuarios as $_usuario)
				$usuarios[$_usuario['id_usuario']] = $_usuario;

		return $usuarios;
	}


	/**
	 * Modifica una configuracion para este usuario
	 * 
	 * @param integer $configuracion El id de la configuracion
	 * @param string $valor (Opcional) El nuevo valor de la configuracion. Si no esta definido, el metodo funciona como un getter
	 * @return string|boolean El valor de la configuracion o boolean si se solicito modificar un valor
	 */ 
	public function configuracion ($configuracion, $valor=null) {

		// Saneamiento de variables
		$configuracion = addslashes($configuracion);
		
		// Obtengo el id de la configuracion
		if (!($id_configuracion = self::id_configuracion($configuracion)))
			return ($this)? $this->fail('No se encontro la configuracion "'.$configuracion.'"') : false;
		
		// Obtengo el objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el id_usuario
		if (!($id_usuario = $Session->get('usuario.id')))
			return ($this)? $this->fail('No estas logueado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Solo me pidio ver el valor de la configuracion, lo pido y retorno
		if ($valor === null)
			return $db->get_var("SELECT IFNULL(uc.valor, c.valor) FROM configuraciones c
								LEFT JOIN usuarios_configuraciones uc ON c.id_configuracion = uc.id_configuracion AND uc.id_usuario = '$id_usuario'
								WHERE c.id_tipo = 2 AND c.id_configuracion = '$id_configuracion'");

		// Saneamiento de la variable faltante
		$valor = addslashes($valor);

		// Si el valor es 'default', borramos esta configuracion para este usuario
		if ($valor == 'default')
			$db->query("DELETE FROM usuarios_configuraciones WHERE id_usuario = '$id_usuario' AND id_configuracion = $id_configuracion LIMIT 1");
		// Modifico la configuracion
		else
			$db->replace('usuarios_configuraciones', array('id_usuario'=>$id_usuario, 'id_configuracion'=>$id_configuracion, 'valor' => $valor));

		return true;
	}

	/**
	 * Devuelve el listado de configuraciones para el usuario logueado
	 * 
	 * @param $id_usuario (opcional) El usuario del que se quieren las configuraciones. Si esta vacio, lo tomo de la sesion
	 * @return array
	 */ 
	public function configuraciones ($id_usuario=null) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el id del usuario
		if (!$id_usuario)
			$id_usuario = $Session->get('usuario.id');
		
		// Listo las configuraciones y las agrupo por nombre
		$configuraciones = array();
		$_configuraciones = $db->get_results("SELECT c.nombre, c.descripcion, IFNULL(uc.valor, c.valor) valor 
								FROM configuraciones c 
								LEFT JOIN usuarios_configuraciones uc ON c.id_configuracion = uc.id_configuracion AND uc.id_usuario = '$id_usuario'
								WHERE 1=1 AND c.id_tipo = 2 ORDER BY 1");

		if ($_configuraciones)
			foreach ($_configuraciones as $conf)
				$configuraciones[$conf['nombre']] = $conf;

		return $configuraciones;
	}

	/**
	 * Devuelve el id de la configuracion desde su string
	 * 
	 * @param string $configuracion El nombre de la configuracion
	 * @return integer
	 */ 
	public function id_configuracion ($configuracion) {

		// Saneamiento de variables
		$configuracion = addslashes($configuracion);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		return $db->get_var("SELECT id_configuracion FROM configuraciones WHERE id_tipo = 2 AND nombre = '".$configuracion."'");
	}
	
}

?>
